const express = require('express') // 导入模块
const bodyParser = require('body-parser')

// 框架实例
const app = express()

// 设计 当前文件夹下面的 public 作为 8000 端口访问的默认返回页面
app.use(express.static('public'))

// 编码设置
app.use(bodyParser.urlencoded({
  extended: true
}))

// 转 JSON 格式
app.use(bodyParser.json())

// 允许所有请求接收跨域
app.use(function (req, res, next) {
  res.header({
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': '*',
    'Access-Control-Allow-Headers': '*'
  })
  next() // 继续完成数据传输
})

// 访问 data 路由，然后处理 get 请求
app.get('/data', function (req, res) {

  // 验证请求对象的信息
  if (req.query.user === 'admin' && req.query.password === '123456') {
    console.log('你好，我是服务器，已收到 GET 请求如下：')

    // 后台接收的数据
    console.log(req.query)

    console.log('正在查询数据库信息...')

    const data = {
      datas: [1, 3, 5, 7, 9],
      files: '这是机密文件！'
    }

    // 将数据原路返回给前端 是JSON格式
    res.send(JSON.stringify(data))
    console.log('已将匹配的信息返回给客户端...')
    console.log('**************************************************');

  } else {
    console.log('抱歉，用户信息错误，无法查询信息！')
    console.log('**************************************************');
    const data = {
      err: '用户信息有误，请重新输入！'
    }
    res.send(JSON.stringify(data))
  }

})

// 处理 post 请求
app.post('/info', function (req, res) {

  console.log('你好，我是服务器，已收到 POST 请求如下：')

  console.log(req.body)
  res.send(req.body)
  console.log('已将数据返回给客户端...')
  console.log('**************************************************');
})

// 处理 options 请求 处理浏览器的预检测机制 允许跨域
app.options('/info', function (req, res, next) {
  res.header({
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': '*',
    'Access-Control-Allow-Headers': '*'
  })
  next()
})

// JSONP 解决跨域
app.get('/jsonp', function (req, res) {

  // 拿到函数名
  const fn = req.query.cb

  if (req.query.user === 'admin' && req.query.password === '123456') {

    console.log('你好，我是服务器，已收到 GET 请求如下：')
    console.log(req.query)

    // 假设有数据
    const data = JSON.stringify({
      datas: [1, 3, 5, 7, 9],
      files: '这是您的专属文件！'
    })
    // 返回数据给前端，并且让前端调用函数去操作数据
    res.send(`${fn}(${data})`)

    console.log('已将匹配的信息返回给客户端...')
    console.log('**************************************************');
  } else {
    console.log('抱歉，用户信息错误，无法查询信息！')
    console.log('**************************************************');
    const data = JSON.stringify({
      err: '用户信息有误，请重新输入！'
    })
    res.send(`${fn}(${data})`)
  }

})

// 监听端口
app.listen(8000, () => {
  console.log('监听端口： 8000')
})